package qnb._common.vo;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import qnb._common.tools.PathTool;
import qnb._common.tools.PropertiesTool;

public class ConditionVO {
    private  String parentheses ;// 小括号 
    private  String andOr ;// 接连符 
    private  String conditionName ;// 条件名 
    private  String conditionValue ;// 条件值
    private  String operator ;// 判断
    
    public static Map<String,String> operatorMap=new HashMap<>();
	private static final Map<String,Map<String,String>> propertiesConfig=new HashMap<>();
	
	static {
		String configFilepath = PathTool.getMyProjectPath("config/condition");
		File files=new File(configFilepath);

		if(files.isDirectory()) {
			PropertiesTool pt=new PropertiesTool();
			String fileName;
			File[] flist=files.listFiles();
			for(File f:flist) {
				
				if(f.isFile()&&f.getName().endsWith(".properties")) {
					fileName=f.getName().substring(0,f.getName().lastIndexOf("."));
					propertiesConfig.put(fileName, pt.loadPropertiesToMap(f));
					System.out.println(f.getName()+":");
					for(Map.Entry<String, String> kv:propertiesConfig.get(fileName).entrySet()) {
						System.out.println(kv.getKey()+"="+kv.getValue());
					}
				}
			}
		}
		
		operatorMap.put("包含", "包含");
    	operatorMap.put("左包含", "左包含");
    	operatorMap.put("右包含", "右包含");
    	operatorMap.put("在什么之中", "在什么之中");
    	operatorMap.put("等于", "=");
    	operatorMap.put("不等于", "<>");
    	operatorMap.put("大于", ">");
    	operatorMap.put("小于", "<");
    	operatorMap.put("大于等于", ">=");
    	operatorMap.put("小于等于", "<=");
	}
    
    /**
          * 根据key，取出判断字符对应的 值 
     * @param key 键
     * @return String
     */
    public static Map<String,String> getPropertiesConfig(String key) {
    	return  propertiesConfig.get(key);
    }  
   
	/**
	 * 对前端上传的值，进行检验。并替换成数据库表的相关列名
	 * @param key 模块名
	 * @param list 条件集合
	 * @return  boolean 检验与替换成功返回true，否则返回false 
	 */
	public static boolean formatConditionVO(String key,List<ConditionVO> list) {
		Map<String,String> config=propertiesConfig.get(key);
		String value;
		for(ConditionVO vo:list) {
			if(null!=vo.getConditionName()&&vo.getConditionName().length()>0) {
				value=config.get(vo.getConditionName());
				if(null==value) {//非法的值。表示没有此关联的数据库表的列名。应该中止操作
					return false;
				}
				vo.setConditionName(value);//把前端现示的中文值，更改为数据库表的列名
				
				value=operatorMap.get(vo.getOperator());
				if(null!=value) {
					vo.setOperator(value);
				}else if(null!=vo.getOperator()&&vo.getOperator().length()>1) {//非法注入的操作符
					return false;
				}
				
				//并且或 转成 and\or
				value=getAndOr(vo.getAndOr());
				if(null!=value) {
					vo.setAndOr(value);
				}else if(null!=vo.getAndOr()&&vo.getAndOr().length()>1) {//非法注入 连接符
					return false;
				}
			}
		}
		return true;
	}
	
    /**
     * 连接符 或|并且 转成 sql语句的字符号
     * @param key
     * @return String
     */
    public static String getAndOr(String key) {
    	if(null==key)return null;
    	if(key.equals("并且"))return "AND";
    	if(key.equals("或"))return "OR";
    	if(key.isEmpty())return "";
    	return null;
    }
    
	public String getParentheses() {
		return parentheses;
	}
	public void setParentheses(String parentheses) {
		this.parentheses = parentheses;
	}
	public String getAndOr() {
		return andOr;
	}
	public void setAndOr(String andOr) {
		this.andOr = andOr;
	}
	public String getConditionName() {
		return conditionName;
	}
	public void setConditionName(String conditionName) {
		this.conditionName = conditionName;
	}
	public String getConditionValue() {
		return conditionValue;
	}
	public void setConditionValue(String conditionValue) {
		this.conditionValue = conditionValue;
	}
	public String getOperator() {
		return operator;
	}
	public void setOperator(String operator) {
		this.operator = operator;
	}
    
    
}
